package ar.edu.utn.frba.dds.tp.code.Asientos;

import java.math.BigDecimal;
import java.util.ArrayList;

import ar.edu.utn.frba.dds.tp.code.usuarios.Usuario;
import ar.edu.utn.frba.dds.tp.code.usuarios.UsuarioStandard;
import ar.edu.utn.frba.dds.tp.code.vuelos.CantReserveException;
import ar.edu.utn.frba.dds.tp.code.vuelos.Vuelo;

public class AsientoDeVuelo {
	
	private Vuelo vuelo;
	private int numeroDeAsiento;
	private BigDecimal precio;
	private ClaseAsiento clase; //turista, ejecutiva o primera
	private UbicacionAsiento ubicacion; //pasillo, centro, ventana
	private EstadoAsiento estado; //comprado, reservado, disponible
	private ArrayList<UsuarioStandard> sobreReservas = new ArrayList<UsuarioStandard>();

	//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	//+++ Constructor ++++++++++++++++++++++++++++++++++++++++++++
	//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	
	public AsientoDeVuelo(int numeroDeAsiento, BigDecimal precio, ClaseAsiento clase,
							UbicacionAsiento ubicacion, EstadoAsiento estado){
		this.numeroDeAsiento = numeroDeAsiento;
		this.precio = precio;
		this.clase = clase;
		this.ubicacion = ubicacion;
		this.estado = estado;
	}
	
	//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	//+++ Accesors +++++++++++++++++++++++++++++++++++++++++++++++
	//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	
	public String getCodigoDeVuelo() {
		return getVuelo().getNroDeVuelo();
	}
	
	public int getNumeroDeAsiento() {
		return numeroDeAsiento;
	}
	
	public void setNumeroDeAsiento(int numero) {
		this.numeroDeAsiento = numero;
	}
	
	public BigDecimal getPrecio() {
		return precio; 
	}
	
	public void setPrecio(BigDecimal precio) {
		this.precio = precio;
	}
	
	public ClaseAsiento getClase() {
		return clase;
	}
	
	public void setClase(ClaseAsiento claseDeAsiento) {
		this.clase = claseDeAsiento;
	}
	
	public UbicacionAsiento getUbicacion() {
		return ubicacion;
	}
	
	public void setUbicacion(UbicacionAsiento ubicacionDeAsiento) {
		this.ubicacion = ubicacionDeAsiento;
	}
	
	public EstadoAsiento getEstado() {
		return estado;
	}
	
	public void setEstado(EstadoAsiento estado) {
		this.estado = estado;
	}
	
	public Vuelo getVuelo() {
		return vuelo;
	}
	
	public void setVuelo(Vuelo vuelo) {
		this.vuelo = vuelo;
	}
	
	public ArrayList<UsuarioStandard> getSobreReservas(){
		return sobreReservas;
	}
	
	//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	//+++ métodos de negocio +++++++++++++++++++++++++++++++++++++
	//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	
	public boolean soySuperOferta(){    
		return this.clase.precioOferta(this.vuelo.getAerolinea().getImpuesto(), this.precio); 		
	}

	public void reservar(UsuarioStandard reservante){
		this.getVuelo().getAerolinea().reservarAsiento(this, reservante);
	}

	public void comprar(Usuario comprador) {
		this.getVuelo().getAerolinea().comprarAsiento(this, comprador);
	}
	
	public void agregarSobreReserva(UsuarioStandard reservante) {
		if (asientoNoFueComprado())
			sobreReservas.add(reservante);
		else
			throw new CantReserveException("El asiento se encuentra comprado");
	}

	private boolean asientoNoFueComprado() {
		return !getEstado().equals(EstadoAsiento.COMPRADO);
	}

	public UsuarioStandard primerSobreReservante() { 
		if (existenSobreReservas())
			return sacarPrimerSobreReservante();
		return null;  // TODO: modificar
	}

	private UsuarioStandard sacarPrimerSobreReservante() {
		return sobreReservas.remove(0);
	}

	private boolean existenSobreReservas() {
		return sobreReservas.size() > 0;
	}

	public void eliminarSobreReservantes() {
		this.sobreReservas.clear();
	}
	
	//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	//+++ Redef. equals ++++++++++++++++++++++++++++++++++++++++++
	//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	
	public boolean equals(AsientoDeVuelo asiento){
		if (this == asiento) return true;
		if (asiento == null) return false;
		if (
			(!getClase().equals(asiento.getClase()))
			|| (!getCodigoDeVuelo().equals(asiento.getCodigoDeVuelo()))
			|| (!getPrecio().equals(asiento.getPrecio()))
			|| (!getUbicacion().equals(asiento.getUbicacion()))
			|| (!getVuelo().equals(asiento.getVuelo()))
				) return false;
		return true;
	}

}
